package com.unitd.base.module.consumer.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.unitd.base.frame.plugin.module.dto.ResponseUtils;
import com.unitd.base.frame.util.StringUtils;
import com.unitd.base.module.consumer.comm.annotation.LoginUser;
import com.unitd.base.module.consumer.comm.controller.ApiBaseAction;
import com.unitd.base.module.consumer.comm.enums.UserLevelEnum;
import com.unitd.base.module.master.pojo.dto.CompanyUserVO;
import com.unitd.base.module.master.pojo.dto.UserVO;
import com.unitd.base.module.master.service.CompanyUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * 公司用户信息管理前端控制器
 *
 * @author hudan
 * @version 1.0
 * @filename ApiCompanyUserController.java
 * @copyright www.unitd.com
 * @date 2020-07-10
 */
@Api(tags = "A-公司用户信息管理")
@RestController
@RequestMapping("/api/company/user")
@Slf4j
public class ApiCompanyUserController extends ApiBaseAction {

    @Autowired
    private CompanyUserService companyUserService;

    /**
     * 根据当前登录的公司管理员信息,获取该公司下的有效公司用户列表
     *
     * @param loginUser 当前登录的公司管理员
     * @return 公司用户列表
     */
    @ApiOperation(value = "获取当前登录的公司管理员下的所有公司用户列表", response = Map.class)
    @PostMapping("lists")
    public Map<String, Object> lists(@LoginUser UserVO loginUser) {
//        JSONObject jsonParam = this.getJsonRequest();
//        Long userLevelId = jsonParam.getLong("userLevelId");
        Long userLevelId = loginUser.getUserLevelId();
        /* 定义查询条件 */
        Map<String, Object> param = Maps.newHashMap();
        param.put("userLevelId", userLevelId);
        if (userLevelId != 4) {
            param.put("status", 1);
        }
        param.put("companyId", loginUser.getCompanyDatasource().getCompanyId());

        // 发起分页查询
        List<CompanyUserVO> companyUsers = companyUserService.selectByCompanyIdAndUserLevelId(param);
        return ResponseUtils.toResponsSuccess(companyUsers);
    }

    /**
     * 根据当前登录的公司管理员信息以及公司用户编号,获取该用户详情
     *
     * @param loginUser 当前登录的公司管理员
     * @return 公司用户详情
     */
    @ApiOperation(value = "获取当前登录的公司管理员下的所指定用户详情", response = Map.class)
    @PostMapping("detail")
    public Map<String, Object> detail(Long id, @LoginUser UserVO loginUser) {
        Long companyId = loginUser.getCompanyDatasource().getCompanyId();

        CompanyUserVO companyUser = companyUserService.selectByCompanyIdAndUserId(companyId, id);
        return ResponseUtils.toResponsSuccess(companyUser);
    }

    /**
     * 保存公司用户信息
     *
     * @param loginUser 当前登录的公司管理员
     * @return 保存结果
     */
    @ApiOperation(value = "新增/修改当前登录的公司管理员下的所指定用户详情", response = Map.class)
    @PostMapping("save")
    public Map<String, Object> save(@LoginUser UserVO loginUser) {
        JSONObject jsonParam = this.getJsonRequest();
        Long userId = jsonParam.getLong("userId");
        CompanyUserVO companyUser = JSON.toJavaObject(jsonParam, CompanyUserVO.class);
        companyUser.setId(userId);
        // 新建公司用户信息，默认为3
        companyUser.setUserLevelId(UserLevelEnum.COMPANY_USER.getKey());
        companyUser.setCompanyId(loginUser.getCompanyDatasource().getCompanyId());
        if (StringUtils.isNull(companyUser.getNickName())) {
            companyUser.setNickName(companyUser.getUserName());
        }

        companyUserService.save(companyUser);

        return ResponseUtils.toResponsSuccess("保存成功!");
    }

    /**
     * 删除指定的公司用户信息
     */
    @ApiOperation(value = "删除指定的公司用户信息", response = Map.class)
    @PostMapping("delete")
    public Object delete(@LoginUser UserVO loginUser) {
        JSONObject jsonParam = this.getJsonRequest();
        Long id = jsonParam.getLongValue("id");
        companyUserService.deleteById(id);
        return ResponseUtils.toResponsSuccess("刪除成功!");
    }

    /**
     * 修改当前用户的代理的用户id
     *
     * @param loginUser 当前登录的公司管理员
     * @return 保存结果
     */
    @ApiOperation(value = "修改当前用户的代理的用户id", response = Map.class)
    @PostMapping("updateProxyUser")
    public Map<String, Object> updateProxyUser(@LoginUser UserVO loginUser) {
        JSONObject jsonParam = this.getJsonRequest();
        Long proxyUserId = jsonParam.getLong("proxyUserId");
        // 公司用户给自己设置代理用户复用这个方法
        CompanyUserVO companyUser = companyUserService.selectByMobile(loginUser.getMobile());
        companyUser.setProxyUserId(proxyUserId);
        companyUserService.save(companyUser);
        return ResponseUtils.toResponsSuccess("保存成功!");
    }

    /**
     * 根据id修改公司客户状态（公司管理员给公司客户授权）
     *
     * @param loginUser 当前登录的公司管理员
     * @return 保存结果
     */
    @ApiOperation(value = "根据id修改公司客户状态（公司管理员给公司客户授权）", response = Map.class)
    @PostMapping("updateStatus")
    public Map<String, Object> updateStatus(@LoginUser UserVO loginUser) {
        JSONObject jsonParam = this.getJsonRequest();
        String mobile = jsonParam.getString("mobile");
        String status = jsonParam.getString("status");

        companyUserService.updateStatusByMobile(mobile, status);
        return ResponseUtils.toResponsSuccess("保存成功!");
    }
}